OPTION 01

MySQL 数据类型

数据类型就是告诉数据库:这一列要存什么格式的数据?
选对类型,省空间、跑得快、还不出错。

1

数字类型

数字类型分两大家族:整数类型(没有小数点)和 数值类型(可以有小数点)。

想象你在超市:
整数类型 = 数人头、数苹果——只能是 1个、2个、3个,不会出现 1.5 个人。
数值类型 = 称重、算价格——可以是 3.14 元、72.5 kg 这种带小数的。

🔢 整数家族

TINYINT-128 ~ 127
SMALLINT-3.2万 ~ 3.2万
MEDIUMINT-838万 ~ 838万
INT-21亿 ~ 21亿
BIGINT超大!天文数字
越小的类型越省空间。存年龄用 TINYINT 就够了(0~255),没必要用 INT

📐 数值家族(带小数)

DECIMAL精确小数
FLOAT近似·4字节
DOUBLE近似·8字节
REAL≈DOUBLE
!
DECIMAL 是精确计算,算钱必须用它!FLOAT/DOUBLE 是近似值,适合科学计算,但做财务会出问题(比如 0.1+0.2 ≠ 0.3)。
-- 创建一个商品表
CREATE TABLE products (
  id INT,           -- 商品编号,用整数
  stock SMALLINT,     -- 库存数量,几万以内够了
  price DECIMAL(10,2) -- 价格,精确到分
);
2

字符串类型

用来存文字的类型,主要有三兄弟:CHARVARCHARTEXT

CHAR = 固定大小的信封 📨 —— 不管你写了几个字,信封大小不变,空位补空格。
VARCHAR = 可伸缩的快递袋 📦 —— 装多少东西就占多大空间,更省地方。
TEXT = 大卡车 🚛 —— 专门拉超长文本:文章、日记、评论……
类型特点适用场景
CHAR(n) 定长,最多 255 字符 身份证号、手机号、性别(M/F)
VARCHAR(n) 变长,最多 65535 字节 用户名、邮箱、地址
TINYTEXT 最多 255 字节 短备注
TEXT 最多 ~6.5万 字节 文章正文、评论
MEDIUMTEXT 最多 ~1600万 字节 长篇内容
LONGTEXT 最多 ~42亿 字节 超长文档(一般用不到)
i
如果内容长度比较固定(比如手机号固定11位),用 CHAR 查询更快;长度不确定就用 VARCHAR,更省空间。
-- 创建用户表
CREATE TABLE users (
  phone CHAR(11),      -- 手机号,固定11位
  name VARCHAR(50),    -- 姓名,长度不定
  bio TEXT             -- 个人简介,可能很长
);
3

时间日期类型

时间类型用来记录"什么时候"发生的事,有 5 种选择。

DATE = 日历上的某一天 📅(只有年月日)
TIME = 闹钟上的时刻 ⏰(只有时分秒)
DATETIME = 日历 + 闹钟 📅⏰(年月日时分秒,完整记录)
TIMESTAMP = 和 DATETIME 类似,但会自动跟着时区变
YEAR = 只记年份 🗓️(2024、2025……)
DATE2025-03-16
TIME14:30:00
YEAR2025
DATETIME完整日期时间
TIMESTAMP自动跟时区
DATETIME 存的是你写入的值,不会变;TIMESTAMP 会根据服务器时区自动转换,适合做"创建时间"、"更新时间"。
-- 记录订单时间
CREATE TABLE orders (
  order_date DATE,                  -- 下单日期
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                                      -- 自动记录创建时间
  birth_year YEAR                  -- 出生年份
);
4

二进制类型

二进制类型存的是原始字节数据,不关心是什么文字编码。

字符串类型像是存"看得懂的文字",二进制类型像是存"看不懂的原始文件"——比如图片、音频、加密数据。
BINARY/VARBINARY = 小文件存储格
BLOB = 大文件仓库(Binary Large Object)
BIT位字段
BINARY定长二进制
VARBINARY变长二进制
TINYBLOB255字节
BLOB~65KB
MEDIUMBLOB~16MB
LONGBLOB~4GB
!
BIT 存的是位(0/1),如果输入值不够长,左边自动补 0。BINARY 是定长的,VARBINARY 是变长的,和 CHAR 与 VARCHAR 的关系一样。
i
实际项目中,大文件(图片、视频)一般不直接存数据库,而是存到文件服务器/OSS,数据库里只存一个 URL 路径。
5

其他类型(ENUM & SET)

MySQL 还有两种特殊的"选择题"类型:ENUM(单选)和 SET(多选)。

ENUM = 单选题 🔘 —— 男/女/保密,只能选一个。
SET = 多选题 ☑️ —— 爱好:游泳/跑步/篮球,可以同时选好几个。
ENUM单选·最多65535个
SET多选·最多64个
ENUM 内部存的是数字编号(1, 2, 3…),比存字符串省空间,查询也更快。
-- ENUM: 性别只能选一个
gender ENUM('男', '女', '保密')

-- SET: 爱好可以多选
hobbies SET('游泳', '跑步', '篮球', '阅读')

-- 插入数据
INSERT INTO students (gender, hobbies)
VALUES ('男', '游泳,篮球'); -- SET多选用逗号分隔